/**
 * @file drv_usart.h
 * @brief 本文件包含了 USART 通信的函数原型，支持 DMA 使用 STM32 HAL 库。
 *
 * 该头文件提供了 USART 初始化函数以及使用 DMA 发送数据的函数，
 * 还包括 DMA 接收完成后调用的回调函数。
 */

#ifndef __DRV_USART_H
#define __DRV_USART_H

#ifdef __cplusplus
extern "C" {
#endif

#include "usart.h"
#include "stdint.h"
#include "stdio.h"

#define RX_BUF_SIZE 64  //4*16 3*16=48

typedef enum {
    USART1_PORT = 0,
    USART2_PORT = 1 ,
    USART3_PORT = 2
} DRV_USART_PORT;

/* 定义UART实例结构体 */
typedef struct {
    UART_HandleTypeDef* huart;
    DMA_HandleTypeDef*  hdma_rx;
    DMA_HandleTypeDef*  hdma_tx;
    uint8_t*            rx_buffer;
    DRV_USART_PORT      src_id;
} uart_instance_t;

/* 错误等级分类 */
typedef enum {
    UART_ERR_RECOVERABLE,   // 可恢复错误（如帧错误、噪声错误）
    UART_ERR_OVERRUN,       // 溢出错误
    UART_ERR_DMA,           // DMA传输错误
    UART_ERR_HARDWARE       // 需硬件复位（严重错误）
} uart_error_level_t;

/**
 * @brief 初始化 USART 通信。
 *
 * 该函数配置 USART 外设，启用 DMA 传输和接收功能。
 * 在使用其他 USART 函数之前，必须先调用此函数进行初始化。
 */
void drv_usart_init(void);


void drv_usart_send_data(DRV_USART_PORT port, uint8_t *send_data, uint16_t size);
/**
 * @brief USART 接收完成后的回调函数。
 *
 * @param huart 指向触发回调的 UART 句柄的指针。
 *
 * 该函数由 HAL 库在 DMA 接收完成时自动调用。可以在此函数中
 * 处理接收到的数据，并根据需要重新启动接收操作。
 */
// void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart);

void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size);


void HAL_UART_ErrorCallback(UART_HandleTypeDef * huart);


#ifdef __cplusplus
}
#endif

#endif /* __drv_usart_H */
